package cn.bonoon.kernel.web.models;

import java.io.Serializable;

import javax.persistence.PersistenceException;

/**
 * 定义返回的json数据值实体
 * @author jackson
 *
 */
public final class JsonResult implements Serializable {
	/**
	 * 成功
	 */
	public static final int SUCCESS = 0;
	/**
	 * 普通的异常
	 */
	public static final int ERROR = 1;
	/**
	 * 没有登录的异常
	 */
	public static final int LOGOUT = 2;
	/**
	 * 这种情况比较特殊，控制器处理返回错误的结果和与该错误相关的数据，界面除了提示错误信息外，还需要定义额外的对这种错误的数据进行处理
	 */
	public static final int ERROR2 = 3;
	/**
	 * 正常，但有信息需要提示，界面应该使用alert来显示
	 */
	public static final int PROMPT = 10;

	public final static JsonResult NULL = new JsonResult();
	/**
	 * 
	 */
	private static final long serialVersionUID = 8388317500364381688L;

	public static String errorMessage(Throwable ex){

		Throwable cause = ex;
		
		while(null != cause.getCause()){
			cause = cause.getCause();
			
			if(cause instanceof PersistenceException){
				return "系统繁忙，请稍后再试！";
			}
		}
		
//		if(cause instanceof QueryTimeoutException){
//			return "系统繁忙，请稍后再试！";
//		}
		
		return cause.getMessage();
	}
	public static JsonResult error(Throwable ex){
		return new JsonResult(ERROR, errorMessage(ex), null);
	}

	public static JsonResult logonError(Throwable ex){
		return new JsonResult(ERROR, errorMessage(ex), null);
	}

	public static JsonResult error(Throwable ex, Object data){
		return new JsonResult(ERROR2, errorMessage(ex), data);
	}

	public static JsonResult error(String msg) {
		return new JsonResult(ERROR, msg, null);
	}

	public static JsonResult error(String msg, long timeout) {
		return new JsonResult(ERROR, msg, timeout);
	}
	/**
	 * 逻辑处理结果返回异常
	 * @param error
	 */
	public static JsonResult result(int error) {
		return new JsonResult(error, "", null);
	}

	/**
	 * 接受处理过程所抛出来的异常信息
	 * @param ex
	 */
	public static JsonResult result(Throwable ex) {
		return new JsonResult(1, errorMessage(ex), null);
	}

	public static JsonResult result() {
		return NULL;
	}

	/**
	 * 返回成功处理的结果值
	 * @param data
	 */
	public static JsonResult result(Object data) {
		return new JsonResult(SUCCESS, "", data);
	}

	/**
	 * 异常结果，并说明异常信息
	 * @param error
	 * @param msg
	 */
	public static JsonResult result(int error, String msg) {
		return new JsonResult(error, msg, null);
	}

	/**
	 * 返回处理成功的结果，并附加信息返回
	 * @param data
	 * @param msg
	 */
	public static JsonResult result(Object data, String msg) {
		return new JsonResult(PROMPT, msg, data);
	}

	/**
	 * 默认构造函数，表示处理结果成功，不需要对界面返回值
	 */
	private JsonResult() {
	}

	/**
	 * 初始化方法
	 * @param error 返回的结果是不是异常结果
	 * @param msg 需要返回到页面的信息
	 * @param data 需要返回到页面的数据
	 */
	public JsonResult(int error, String msg, Object data) {
		this.error = error;
		this.msg = msg;
		this.data = data;
	}

	/**
	 * <pre>
	 * 返回的结果是不是异常结果
	 * 
	 * 由于boolean值没法返回错误的类型，所以从第三版以后将返回一个int类型，可以指定异常的类型；
	 * 如：1-异常；2-未登录；3-没有访问权限等
	 * </pre>
	 */
	private int error;

	/**
	 * 需要返回到页面的信息
	 */
	private String msg;

	/**
	 * 需要返回到页面的数据
	 */
	private Object data;

	public int getError() {
		return error;
	}

	public String getMsg() {
		return msg;
	}

	public Object getData() {
		return data;
	}
}
